# @Version        : 1.0
# @Update Time    : 2025/10/15 00:00
# @File           : token.py
# @IDE            : PyCharm
# @Desc           : Token相关模型
from typing import Optional, Dict, Any
from pydantic import BaseModel, Field


class TokenInfo(BaseModel):
    """
    Token信息模型
    用于存储和返回token相关信息
    """

    # token名称
    token_name: str = Field(..., description="token名称")

    # token值
    token_value: Optional[str] = Field(None, description="token值")

    # 是否已登录
    is_login: bool = Field(False, description="是否已登录")

    # 登录ID
    login_id: Optional[Any] = Field(None, description="登录ID")

    # 登录类型
    login_type: str = Field(..., description="登录类型")

    # token剩余有效时间（秒）
    token_timeout: int = Field(-1, description="token剩余有效时间（秒）")

    # session剩余有效时间（秒）
    session_timeout: int = Field(-1, description="session剩余有效时间（秒）")

    # token-session剩余有效时间（秒）
    token_session_timeout: int = Field(
        -1, description="token-session剩余有效时间（秒）"
    )

    # token活跃超时时间（秒）
    token_active_timeout: int = Field(-1, description="token活跃超时时间（秒）")

    # 登录设备类型
    login_device_type: Optional[str] = Field(None, description="登录设备类型")

    # 扩展信息
    extra_data: Optional[Dict[str, Any]] = Field(
        default_factory=dict, description="扩展信息"
    )

    class Config:
        json_schema_extra = {
            "example": {
                "token_name": "Authorization",
                "token_value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
                "is_login": True,
                "login_id": "user123",
                "login_type": "user",
                "token_timeout": 3600,
                "session_timeout": 7200,
                "token_session_timeout": 3600,
                "token_active_timeout": 1800,
                "login_device_type": "pc",
                "extra_data": {},
            }
        }


class TokenResponse(BaseModel):
    """
    Token响应模型
    用于API返回token信息
    """

    # 访问token
    access_token: str = Field(..., description="访问token")

    # token类型
    token_type: str = Field("bearer", description="token类型")

    # token过期时间（可选）
    expires_in: Optional[int] = Field(None, description="token过期时间（秒）")

    # 刷新token（可选）
    refresh_token: Optional[str] = Field(None, description="刷新token")

    # 作用域（可选）
    scope: Optional[str] = Field(None, description="作用域")

    # 扩展信息（可选）
    extra: Optional[Dict[str, Any]] = Field(
        default_factory=dict, description="扩展信息"
    )

    class Config:
        json_schema_extra = {
            "example": {
                "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
                "token_type": "bearer",
                "expires_in": 3600,
                "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
                "scope": "read write",
                "extra": {},
            }
        }


class LoginResponse(BaseModel):
    """
    登录响应模型
    包含登录成功后的所有信息
    """

    # 登录是否成功
    success: bool = Field(True, description="登录是否成功")

    # token信息
    token: TokenResponse = Field(..., description="token信息")

    # 用户信息（可选）
    user_info: Optional[Dict[str, Any]] = Field(
        default_factory=dict, description="用户信息"
    )

    # 角色列表（可选）
    roles: Optional[list] = Field(default_factory=list, description="角色列表")

    # 权限列表（可选）
    permissions: Optional[list] = Field(default_factory=list, description="权限列表")

    class Config:
        json_schema_extra = {
            "example": {
                "success": True,
                "token": {
                    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
                    "token_type": "bearer",
                    "expires_in": 3600,
                },
                "user_info": {
                    "id": "user123",
                    "username": "admin",
                    "nickname": "管理员",
                },
                "roles": ["admin", "user"],
                "permissions": ["read", "write", "delete"],
            }
        }
